package springboot.file.demo.util;

import java.io.FileInputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.io.InputStream;
import net.sf.jxls.transformer.XLSTransformer;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.springframework.util.StringUtils;
import springboot.file.demo.pojo.vo.ExcelVO;

/**
 * 导出模板工具
 *
 * @author chensq
 */
public class ExportTemplateUtil {
    /**
     * 导出不规则公共方法 .xlsx .xls两种格式
     *
     * @param excelVO  入参
     * @param response 响应结果
     */
    public void exportTemplate(ExcelVO excelVO, HttpServletResponse response) {
        URL url = this.getClass().getClassLoader().getResource("");
        assert url != null;
        String path = url.getPath();
        if (!StringUtils.isEmpty(excelVO.getPath())){
            path = excelVO.getPath();
        }
        //获得模版路径
        String templateUrl = path + excelVO.getTemplateUrl();
        //生成的导出文件路径
        String templateNewUrl = path + excelVO.getTemplateNewUrl();

        System.out.println("+++++生成的导出文件路径:"+templateNewUrl);
        //transformer转到Excel
        XLSTransformer transformer = new XLSTransformer();
        // 设置输出的格式
        response.reset();
        response.setContentType("bin");
        // 循环取出流中的数据
        byte[] b = new byte[1024];
        int len;
        try {
            // 下载本地文件 文件的默认保存名
            String fileName = URLEncoder.encode(excelVO.getFileName(), "UTF-8");
            System.out.println("----------------------下载的本地文件名称："+fileName);
            //更新模板信息
            transformer.transformXLS(templateUrl, excelVO.getMap(), templateNewUrl);

            // 读到流中 文件的存放路径
            InputStream inStream = new FileInputStream(templateNewUrl);
            response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
            while ((len = inStream.read(b)) > 0) {
                response.getOutputStream().write(b, 0, len);
            }
            inStream.close();
        } catch (IOException e) {
        	e.printStackTrace();
        } catch (InvalidFormatException e) {
        	e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
